package com.itbaizhan.service;

import com.itbaizhan.domain.CancelLog;
import com.itbaizhan.domain.ConfirmLog;
import com.itbaizhan.domain.TryLog;
import com.itbaizhan.domain.UserAccount;
import com.itbaizhan.dto.UserAccountDTO;
import com.itbaizhan.mapper.CancelLogMapper;
import com.itbaizhan.mapper.ConfirmLogMapper;
import com.itbaizhan.mapper.TryLogMapper;
import com.itbaizhan.mapper.UserAccountMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.dromara.hmily.annotation.HmilyTCC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * @author spf
 * @date 2024/4/18
 * @time 15:36
 */
@Service
@Slf4j
public class UserAccountService01 {

    @Autowired
    private UserAccountMapper userAccountMapper;
    @Autowired
    private TryLogMapper tryLogMapper;
    @Autowired
    private ConfirmLogMapper confirmLogMapper;
    @Autowired
    private CancelLogMapper cancelLogMapper;
    @Reference(version = "1.0.0")
    private UserAccountService userAccountService;

    @HmilyTCC(confirmMethod = "sayConfirm",cancelMethod = "sayCancel")
    public void transfer(UserAccountDTO userAccountDTO) {
        String txNo = userAccountDTO.getTxNo();
        log.info("**********  执行bank01 的 try方法 ，事务id={}",txNo);
        TryLog tryLog = tryLogMapper.selectById(txNo);
        if (tryLog != null){
            return;
        }
        if (confirmLogMapper.selectById(txNo) != null || cancelLogMapper.selectById(txNo) != null){
            return;
        }

        UserAccount userAccount = userAccountMapper.selectById(userAccountDTO.getAccountNo1());
        if (userAccount != null){
            userAccount.setAccountBalance(userAccount.getAccountBalance().subtract(userAccountDTO.getAccountBalance()));
            userAccount.setTransferAmount(userAccount.getTransferAmount().add(userAccountDTO.getAccountBalance()));
            userAccountMapper.updateById(userAccount);
        }

        TryLog tryLog1 = new TryLog();
        tryLog1.setTxNo(txNo);
        tryLog1.setCreateTime(new Date());

        System.out.println("b1try阶段");
        userAccountService.transfer(userAccountDTO);
    }

    public void sayConfirm(UserAccountDTO userAccountDTO){
        String txNo = userAccountDTO.getTxNo();
        log.info("**********  执行bank01 的 Confirm方法 ，事务id={}",txNo);
        ConfirmLog confirmLog = confirmLogMapper.selectById(txNo);
        if (confirmLog!=null){
            return;
        }

        UserAccount userAccount = userAccountMapper.selectById(userAccountDTO.getAccountNo1());
        userAccount.setTransferAmount(userAccount.getTransferAmount().subtract(userAccountDTO.getAccountBalance()));
        userAccountMapper.updateById(userAccount);

        ConfirmLog confirmLog1 = new ConfirmLog();
        confirmLog1.setTxNo(txNo);
        confirmLog1.setCreateTime(new Date());

        System.out.println("b1 confirm阶段");
    }

    public void sayCancel(UserAccountDTO userAccountDTO){
        String txNo = userAccountDTO.getTxNo();
        CancelLog cancelLog = cancelLogMapper.selectById(txNo);
        if (cancelLog!=null){
            return;
        }

        UserAccount userAccount = userAccountMapper.selectById(userAccountDTO.getAccountNo1());
        userAccount.setAccountBalance(userAccount.getAccountBalance().add(userAccountDTO.getAccountBalance()));
        userAccount.setTransferAmount(userAccount.getTransferAmount().subtract(userAccountDTO.getAccountBalance()));
        userAccountMapper.updateById(userAccount);

        System.out.println("b1cancel阶段");
    }
}
